🎯 Esercitazione Complessa: Sistema di Gestione Inventario e Logistica (JSON/Python)

Obiettivo: Sviluppare in Python una classe per la gestione dell'inventario di un magazzino, utilizzando i dati in formato JSON come database persistente.

📜 Scenario

La società "TechSupplies S.p.A." ha bisogno di un sistema che gestisca il suo inventario di prodotti elettronici e tracci i movimenti logistici in un file JSON chiamato magazzino.json.


Parte 1: Progettazione e Sintassi JSON (Valore: 25%)

Gli studenti devono creare il file iniziale magazzino.json con la seguente struttura:

  1. Oggetto Radice: Deve contenere due proprietà principali: inventario (un array di oggetti) e logistica (un oggetto annidato).
  2. Array inventario: Contiene la lista dei prodotti, ognuno rappresentato da un oggetto JSON con le seguenti proprietà (utilizzando i tipi di dati JSON corretti: stringa, numero, booleano, null):
    • codice_sku (stringa univoca)
    • nome_prodotto (stringa)
    • prezzo_unitario (numero, decimale)
    • quantita_disponibile (numero, intero)
    • fornitore_principale (stringa, deve usare la convenzione snake_case)
    • data_ultimo_carico (stringa, formato data ISO 8601)
    • in_riordino (booleano)
    • note_speciali (deve essere null se non ci sono note)
  3. Oggetto logistica: Contiene le seguenti proprietà:
    • regioni_spedizione (un array di stringhe, contenente almeno 3 regioni)
    • ultimo_aggiornamento (stringa data/ora)
    • errori_di_carico (numero, intero)

Consegna 1.1: File JSON Iniziale

Creare il file magazzino.json con almeno **tre** prodotti diversi, assicurandosi che sia sintatticamente **valido** (verificare l'assenza di virgole finali, l'uso esclusivo delle virgolette doppie per chiavi e stringhe, ecc.).


Parte 2: Implementazione in Python e Serializzazione (Valore: 35%)

Gli studenti devono creare una classe Python MagazzinoManager che gestisca la persistenza dei dati utilizzando il modulo json.

Mappatura Tipi Python JSON
Dizionariodictobject
Listalistarray
Stringastrstring
Numeroint o floatnumber
BooleanoTrue / Falsetrue / false
NulloNonenull

Compiti di Implementazione

  1. Inizializzazione (__init__): La classe deve tentare di caricare i dati dal file magazzino.json (Deserializzazione: json.load). Se il file non esiste o è vuoto, deve inizializzare la struttura con dati vuoti predefiniti.
  2. Salvataggio (salva_dati): Implementare un metodo che salvi la struttura dati corrente nel file magazzino.json (Serializzazione: json.dump). Il salvataggio deve usare l'argomento indent=4 per garantire la leggibilità (pretty-print).
  3. Aggiunta Prodotto (aggiungi_prodotto): Un metodo che riceva i dati di un nuovo prodotto come argomenti, lo aggiunga all'array inventario e chiami salva_dati.

Consegna 2.1: Classe Base

Implementare la classe MagazzinoManager con i metodi __init__, salva_dati e aggiungi_prodotto.


Parte 3: Analisi Dati e Gestione Errori (Valore: 40%)

Aggiungere i seguenti metodi avanzati alla classe MagazzinoManager.

  1. Analisi: Articoli Rari (trova_articoli_rari): Implementare un metodo che filtri e restituisca tutti i prodotti la cui quantita_disponibile è inferiore a una soglia passata come parametro (es. 5).
  2. Analisi: Valore Totale (calcola_valore_totale): Implementare un metodo che calcoli e restituisca il valore monetario totale dell'inventario.

    Formula: Somma (quantita_disponibile * prezzo_unitario) per ogni prodotto.

  3. Error Handling (carica_dati_sicuro): Modificare il metodo di caricamento o crearne uno nuovo che implementi un blocco try-except per gestire l'errore di decoding JSON (utilizzando json.JSONDecodeError). In caso di errore di parsing, il sistema deve stampare un messaggio di errore chiaro e caricare una struttura dati vuota per evitare il crash.
  4. Manipolazione Logistica (registra_errore_logistico): Un metodo che incrementi il contatore errori_di_carico all'interno dell'oggetto logistica e aggiorni la proprietà ultimo_aggiornamento con il timestamp corrente (richiede l'uso del modulo datetime di Python e la gestione della sua serializzazione).

Consegna 3.1: Test e Debugging

Implementare i metodi avanzati e dimostrare il loro corretto funzionamento:


✅ Criteri di Valutazione

Criterio Punti Max Dettagli
Sintassi JSON10File magazzino.json è perfettamente valido, corretto uso di tipi/virgolette/virgole finali.
Deserializzazione15Corretto uso di json.load() e gestione del file non esistente/vuoto.
Serializzazione15Corretto uso di json.dump() con indent=4.
Error Handling20Gestione esplicita di json.JSONDecodeError e logica di fallback.
Analisi Dati25Funzioni di filtro (trova_articoli_rari) e calcolo (calcola_valore_totale) corrette.
Manipolazione Dati15Corretta implementazione di registra_errore_logistico (update del contatore e timestamp).
Totale100 punti